prometheus lables
介绍
本篇笔记重点学习Prometheus的relabel_config
.也就是标签的管理,包括标签过滤,自定义标签,动态替换标签等.
在Prometheus的官方文档有详细介绍:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
一. 标签作用
Prometheus中存储的数据为时间序列,是由Metric的名字和一系列的标签(键值对)唯一标识的, 不同的标签代表不同的时间序列,即 通过指定标签查询指定数据 。
Alertmanager还可以根据标签进行分组,将同一个标签的多个告警通知,打包成一条告警短信发送.
二.Metadata标签
在Prometheus所有的Target实例中,都包含一些默认的Metadata标签信息。可以通过Prometheus UI的Targets页面中查看这些实例的Metadata标签的内容:
• address:当前Target实例的访问地址
• scheme:采集目标服务访问地址的HTTP Scheme,HTTP或者HTTPS
• metrics_path:采集目标服务访问地址的访问路径
一般来说元标签只是Prometheus内部使用,**我们一般不会让其做什么事情,并且这些标签是不会写到数据库当中的,使用promql是查询不到这些标签的.
三.自定义标签
在Prometheus的配置文件里可以定义laebls.添加标签的Key:Value信息.Key是标签名,Value是标签值.在下面的例子中,为某个target定义了2个标签:
1 | - job_name: 'Shanghai Linux Server' |
修改标签
在下面2个阶段可以对标签进行修改:
relabel_configs
: 在数据采集之前.在这个阶段可以过滤特定的监控目标(keep,drop),或者过滤某个标签(labelkeep,labeldrop)metric_relabel_configs
: 抓取到数据之后.对标签进行重新标记
修改标签的场景:
- 动态生成新标签(根据已有标签生成新的标签)
- 过滤target(对匹配某个标签的target进行过滤)
- 删除不需要标签
- 添加新标签
标签匹配之后的动作Action:
replace
: 默认.通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组,分组使用$1,$2…引用(正则匹配,提取字段重新创建新标签,注意这里是创建新的标签)keep
: 删除regex与连接不匹配的目标 source_labels,让Prometheus丢弃没有匹配到regex的targetdrop
: 删除regex与连接匹配的目标 source_labels,让Prometheus丢弃匹配到regex的targetlabeldrop
: 删除regex匹配的标签,和drop
区别是这里是删除某个标签,而不是删除targetlabelkeep
: 删除regex不匹配的标签,和keep
区别是这里是删除某个标签,而不是删除targetlabelmap
: 匹配regex所有标签名称,并将捕获的内容分组,用第一个分组内容作为新的标签名(使用正则提取出多个字段,使用匹配到的作为新标签名,但是标签的内容不会改变,相对于对原有标签换了个名字,原标签仍然存在)
修改标签场景实战
下面以Prometheus+Consul的自动发现为例,介绍修改标签的实际场景.
服务器通过Consul的API进行注册:
1 | cat /tmp/consul.json |
服务注册:
1 | curl --request PUT --data @consul-0.json http://172.16.83.201:8500/v1/agent/service/register |
下面是Prometheus的配置文件
1 | - job_name: 'consul-prometheus' |
在Prometheus的UI界面的Service Discovery自动发现可以看到target的label信息
左边是通过consul注册时的meta元标签,在Consul注册时定义的数据都会以__meta_consul_的标签格式展示.而之前提到过, __meta开头的是元数据.只供Prometheus内部使用.
右边的target labels是经过匹配,修改后的标签.而target labels的标签才是我们可以查询或者搜索的,有实际意义的标签.
修改标签场景一: 过滤Target
在Prometheus的配置文件中下面的relabel_configs
定义了一条匹配到
1 | relabel_configs: |
我们在Consul注册的时候定义了一个Tag:node-exporter
.这个配置表示保留__meta_consul_tags
这个标签的值是”.node-exporter.“ 的target.如果服务器注册Consul时,tags不能匹配到”.node-exporter.那么这个服务器会被Prometheus过滤.即使这个服务器运行了node-exporter
我们还可以通过drop
将consul自身的服务器从target里拿掉.
1 | - source_labels: [__meta_consul_service] |
在__meta_consul_service
匹配到consul
值的标签就drop掉.不监控consul服务器
修改标签场景二: 动态新增自定义标签
在通过Consul注册的时候可以携带自定义标签:
1 | "Meta": { |
这些自定义的标签,在Prometheus里会自动添加下面2个标签:
__meta_consul_service_metadata_app=nginx
__meta_consul_service_metadata_project=abc
但是这些标签是元标签.所以要转换成自定义标签.通过下面的Prometheus配置:
1 | - job_name: 'consul-prometheus' |
匹配__meta_consul_service_metadata_(.+)
的标签,然后将匹配到的分组(.+)
生成一个新的标签.
也就是__meta_consul_service_metadata_app=nginx
匹配到app=nginx
.然后生产一个app=nginx
的标签.也就是在Prometheus的UI界面中看到的target labels
labelmap的作用是产生一个新的标签,原来的标签仍然存在.
目前我是利用Ansible的jinjia2模板动态为服务器定义标签,然后在Prometheus中利用labelmap将标签动态生成为自定义标签.
修改标签场景三: 删除某个标签
有些标签不希望被存储上,那么可以使用 labeldrop:删除regex匹配的标签去完成不需要入库 将里面的标签删除掉,在入库之前删除
1 | - job_name: 'Linux Server' |